//
// Created by Martin on 2021/10/25.
//

#include <iostream>
#include <queue>
#include <cstring>

#define DIRECTION_NUMS     8
#define maxn 300

using namespace std;

struct Point {
    int x, y;
    int step;
};

const int dx[DIRECTION_NUMS] = {-2, -2, -1,  1,  2, 2, 1, -1};
const int dy[DIRECTION_NUMS] = { 1, -1, -2, -2, -1, 1, 2,  2};

bool vis[maxn][maxn];
int sx, sy, ex, ey, tx, ty;
int L;

/**
 * 广度优先搜索, 求解骑士移动问题
 * @details
 * 如果起点和终点相等, 则移动步数0;
 * 否则, 先将起点入队列, 然后在循环中:
 * 每从队列头取出一个节点, 就搜索下一次; 下一次要行进的8个方向, 入队列末尾;
 * 一直到行进到终点, 或者可达的所有点都走完
 */
int bfs()
{
    if (sx == ex && sy == ey) return 0; // 起点与终点相同
    memset(vis, 0, sizeof(vis));

    queue<Point> q;
    Point start, node;
    start.step = 0;
    start.x = sx;
    start.y = sy;
    memset(&node, 0, sizeof(node));

    q.push(start);
    int x, y, step;
    while (!q.empty()) {
        // 取出队列头元素
        start = q.front(), q.pop();
        x = start.x;
        y = start.y;
        step = start.step;

        // 8个方向扩展
        for (int i = 0; i < DIRECTION_NUMS; ++i) {
            int tx = x + dx[i];
            int ty = y + dy[i];
            if (tx == ex && ty == ey) return step + 1; // 行进步数
            if (tx >= 0 && tx < L && ty >= 0 && ty < L && !vis[tx][ty]) {
                node.step = step + 1;
                node.x = tx;
                node.y = ty;
                q.push(node);
                vis[tx][ty] = true;
            }
        }
    }

    return -1; // 找不到合适路径
}

int main()
{
    int n, l;
    cin >> n; // 输入用例数
    if (n <= 0) return -1;

    while (n-- > 0) {
        cin >> l; // 输入棋盘大小
        if (l < 4 || l > maxn)
            break;
        L = l;
        cin >> sx >> sy >> ex >> ey; // 输入起点, 终点坐标

        int res = bfs();
        cout << res << endl;
    }

    return 0;
}